//
//  main.m
//  OCBase
//
//  Created by XFB on 2020/1/19.
//  Copyright © 2020 XFB. All rights reserved.
//

#import <Foundation/Foundation.h>
#import <objc/runtime.h>
#import <malloc/malloc.h>

// opensource.apple.com/tarballs
struct NSObject_IMPL {
    // 成员的地址即结构体的地址
    Class isa;
};

/// An opaque type that represents an Objective-C class.
/// 表示Objective-C类的不透明类型。
//typedef struct objc_class *Class;

int main(int argc, const char * argv[]) {
    @autoreleasepool {

        // xcrun -sdk iphoneos clang -arch arm64 -rewrite-objc main.m
        
        NSObject *obj = [[NSObject alloc] init];
//        NSObject *obj = ((NSObject *(*)(id, SEL))(void *)objc_msgSend)((id)((NSObject *(*)(id, SEL))(void *)objc_msgSend)((id)objc_getClass("NSObject"), sel_registerName("alloc")), sel_registerName("init"));

        // 41 11 56 B5 FF FF 1D 00 00 00 00 00 00 00 00 00
        
        // 8 >> 获得NSObject实例对象的成员变量所占用的大小
        NSLog(@"%zd", class_getInstanceSize([NSObject class]));
        // 16 >> 获得obj指针所指向内存的大小
        NSLog(@"%zd", malloc_size((__bridge const void *)obj));
        
        /**
         常用LLDB指令
         print、p：打印
         po 打印对象
         memory read/数量格式字节数 内存地址
         x/数量 格式 字节数 内存地址
         x/3xw 0x100633e80
         x/3个 10进制 4个字节
         
         (lldb) x/4xw 0x100633e80
         0x100633e80: 0xb5561141 0x001dffff 0x00000000 0x00000000
         
         (lldb) x/3xw 0x100633e80
         0x100633e80: 0xb5561141 0x001dffff 0x00000000
         
         (lldb) x/8xw 0x100633e80
         0x100633e80: 0xb5561141 0x001dffff 0x00000000 0x00000000
         
         x是16进制
         f是浮点
         d是10进制
         
         字节大小
         b：byte 1字节
         h：half word 2字节
         w：word 4字节
         g：giant word 8字节
         
         修改内存中的值
         memory write 内存地址 数值
         memory write 0x00000010 10
         memory write 0x100633e89 9
        
         读取内存中地址
         x 0x100633e80
         
         >>>>>>>>>> LLDB 命令 <<<<<<<<<<
         命令格式、help
         expression
         thread
         流程控制
         指令级别的命令
         代码断点
         断点命令
         内存断点
         模块查找
         
         
         */
        
        
    }
    return 0;
}
